
#include "BarraDeFerramentas/BotaoMediana.h"
#include "PetLab.h"

static int s_ordem = 3;

void OperacaoMediana(Tela& tela)
{
    int n = s_ordem;
    MatrizRGBA copia;
    copia = tela.Matriz();
	int *ar = (int*) ::malloc(n*n*sizeof(int));
    int *ag = (int*) ::malloc(n*n*sizeof(int));
    int *ab = (int*) ::malloc(n*n*sizeof(int));
    
    for(int i=0; i<tela.Largura(); i++)
        for(int j=0; j<tela.Altura(); j++)
        {
            int cont=0;
            
            for(int p=-n/2; p<=n/2; p++)
                for(int q=-n/2; q<=n/2; q++)
                    if(i+p>=0 && i+p<tela.Largura() && j+q>=0 && j+q<tela.Altura())
                    {
                        ar[cont] = BANDA_R(copia[i+p][j+q]);
                        ag[cont] = BANDA_G(copia[i+p][j+q]);
                        ab[cont] = BANDA_B(copia[i+p][j+q]);
                        cont++;
                    }
            sort(ar, ar+(n*n));
            sort(ag, ag+(n*n));
            sort(ab, ab+(n*n));
            tela.Set(i, j, RGBA(ar[(n*n)/2+1], ag[(n*n)/2+1], ab[(n*n)/2+1], 255));
        }
 
    tela.Redesenhar();

	::free(ar);
	::free(ag);
	::free(ab);
}


BotaoMediana::BotaoMediana(int cx, int cy, int x, int y)
    : Botao(cx, cy, x, y)
{
    Matriz().Retangulo(0,0,cx,cy,RGBA(0,0,0,0));
    Matriz().Retangulo(0,0,cx-1,cy-1,RGBA(8,108,245,128+32),2);
    
    Texto* texto = new Texto("Mediana", 6, 1);
    texto->Fonte("verdana", 13, RGBA(215,215,215,255));
    AdicionarControle(texto);
}


bool BotaoMediana::AoBaixarEsq(EventoBaixarEsq ev)
{
    s_ordem = g_PetLab->Ferramentas()->Suavizacao()->Mascara()->Ordem();
    OperacaoMediana(*(g_PetLab->m_PainelA->Tela()));
    g_PetLab->m_PainelB->Tela()->Carregar(g_PetLab->m_PainelA->Tela());

	return false;
}
